package cn.edu.jnu;

import cn.edu.jnu.entity.*;
import cn.edu.jnu.utils.GameUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 * 功能：
 * 作者：陈爱国
 * 日期：2024/8/8 22:05
 */
public class GameWin extends JFrame {

    // 游戏状态 0：未开始 1：游戏中 2：暂停 3：通关失败 4：通关成功
    public static int state = 0;

    // 计分 - 每打掉一个敌机计分加1
    public static int score = 0;

    // 敌机生成计数 - 当生成100架后boss才出现
    int enemyCount = 0;

    // 游戏窗口宽度
    int width = 600;
    // 游戏窗口高度
    int height = 600;

    // 重绘次数
    int count = 1;

    // 缓存图片，解决画面闪烁问题
    Image offScreenImage = null;

    // 背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg, 0, -2000, 2);
    // 我方飞机对象
    public PlaneObj planeObj = new PlaneObj(GameUtils.planeImg, 290, 550,20,30,0,this);
    // 敌方boss对象
    public BossObj bossObj = null;

    public void launch(){

        // 设置窗口大小
        this.setSize(width, height);

        // 设置窗口位置 - 居中
        this.setLocationRelativeTo(null);

        // 设置窗口标题
        this.setTitle("飞机大战");

        // 设置页面后自动关闭窗口
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 设置窗口可见
        this.setVisible(true);

        // 将背景和我方飞机添加到游戏物体列表中
        GameUtils.gameObjList.add(bgObj);
        GameUtils.gameObjList.add(planeObj);

        // 添加鼠标点击事件
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // 如果点击鼠标左键并且状态为未开始
                if(e.getButton()==1 && state==0){
                    state = 1;

                    // 刷新屏幕
                    repaint();
                }
            }
        });

        // 添加键盘事件
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                // 如果按空格键 - 切换 暂停/运行 状态
                if(e.getKeyCode() == 32){
                    switch (state){
                        case 1:
                            state = 2;
                            break;
                        case 2:
                            state = 1;
                            break;
                        default:
                            break;
                    }
                }
            }
        });

        // 重复绘制
        while(true){
            // 只有在状态为1的情况下
            if(state==1){
                // 创建对象
                createObj();

                // 重绘界面
                repaint();
            }

            try {
                Thread.sleep(25);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        // super.paint(g);

        if(offScreenImage==null){
            offScreenImage = createImage(width,height);
        }

        Graphics gImg = offScreenImage.getGraphics();

        if(state==0){
            // 绘制背景
            gImg.drawImage(GameUtils.bgImg, 0, 0, null);
            // 绘制boss
            gImg.drawImage(GameUtils.bossImg, 220, 120, null);
            // 绘制explode图片
            gImg.drawImage(GameUtils.explodeImg, 270, 350, null);

            // 绘制文字
            GameUtils.drawWord(gImg, "点击游戏开始", Color.yellow, 40, 180, 300);
        }

        if(state==1){
            // 将爆炸列表添加到游戏列表中
            GameUtils.gameObjList.addAll(GameUtils.explodeObjList);

            // 绘制游戏物体列表中的所有物体
            for (int i = 0; i < GameUtils.gameObjList.size(); i++) {
                GameUtils.gameObjList.get(i).paintSelf(gImg);
            }

            // 从游戏物体列表中删除待删除的游戏对象
            GameUtils.gameObjList.remove(GameUtils.removeObjList);
        }

        // 通过失败
        if(state==3){
            // 绘制explode图片
            gImg.drawImage(GameUtils.explodeImg, planeObj.getX()-35, planeObj.getY()-50, null);

            // 绘制文字
            GameUtils.drawWord(gImg, "点击游戏开始", Color.red, 50, 180, 300);
        }

        // 游戏通关
        if(state==4){
            // 绘制explode图片
            gImg.drawImage(GameUtils.explodeImg, bossObj.getX()+30, bossObj.getY(), null);

            // 绘制文字
            GameUtils.drawWord(gImg, "游戏通关", Color.green, 50, 180, 300);
        }

        // 绘制计分面板
        GameUtils.drawWord(gImg, score + " 分", Color.green, 40, 30, 100);

        // 将图片绘制
        g.drawImage(offScreenImage, 0, 0, null);

        count++;
    }

    // 生成游戏对象
    public void createObj(){
        // 控制批量生成游戏物体速度
        if(count%15==0) {
            // 添加我方子弹
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg, planeObj.getX() + 3, planeObj.getY() - 16, 14, 29, 5, this));
            // 将最后一个子弹添加到游戏物体列表中
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size() - 1));
        }

        // 批量添加敌机
        if(count%15==0) {
            // 添加敌机
            GameUtils.enemyObjList.add(new EnemyObj(GameUtils.enemyImg, (int)(Math.random() * 12) * 50, 0, 49, 36, 5, this));
            // 将敌机添加到游戏物体列表中
            GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size() - 1));

            // 敌机数增加
            enemyCount++;
        }

        //批量产生敌方子弹
        if(count%15==0 && bossObj!=null){
            // 添加敌方子弹
            GameUtils.bulletObjList.add(new BulletObj(GameUtils.bulletImg, bossObj.getX()+76, bossObj.getY()+85, 14,25, 5, this));
            // 将敌方子弹列表中的最后一个添加到游戏对象列表中
            GameUtils.gameObjList.add(GameUtils.bulletObjList.get(GameUtils.bulletObjList.size()-1));
        }

        // 当敌机数增加到100架后才产生boss
        if(enemyCount>=100 && bossObj==null){
            // 产生boss
            bossObj = new BossObj(GameUtils.bossImg, 250, 35, 157,109, 5, this);

            // 将boss添加到游戏物品列表中
            GameUtils.gameObjList.add(bossObj);
        }
    }

    public static void main(String[] args) {
        GameWin gw = new GameWin();
        gw.launch();
    }
}
